package com.specter.mvc.model;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import com.specter.utils.BeanUtils;

import lombok.Getter;
import lombok.Setter;

/**
 * 页面请求内容封装
 * 
 * @author Liang.Wang
 * 
 */

public class Request extends LinkedHashMap<String, Object> {
	private static final long serialVersionUID = 1L;

	/** 请求的页码数 默认为 1 */
	@Getter @Setter
	private long pageno = 1L;
	/** 每页条数限制 默认为 15 条 */
	@Getter @Setter
	private long limit = 15L;
	/** 总记录条数 */
	@Getter @Setter
	private long rowCount;
	/** 动态表名 */
	@Getter @Setter
	private String tableName;
	/** 查询规则 */
	private Map<String, Object> codex = new HashMap<>();
	/** 默认会以(COLUMN_NAME,ASC)的方式整理排序 */
	private Map<String, Object> orders_;
	/** 分页查询的方式(COUNT,LIST,PAGE) 默认为 PAGE */
	@Getter @Setter
	private QueryType queryType = QueryType.PAGE;

	/**
	 * 构造对象
	 * 
	 * @return 实例化对象
	 */
	public static Request me() {
		return new Request();
	}

	/**
	 * 构造参数
	 * 
	 * @return 参数map
	 */
	public Map<String, Object> params() {
		this.codex.put("orders_", this.orders_);
		return this.codex;
	}

	/**
	 * 设置动态表名
	 * 
	 * @param tableName 设置动态表名
	 */
	public Request table(String tableName) {
		this.tableName = tableName;
		return this;
	}

	/**
	 * 将对象增加到条件Map中
	 * 
	 * @param object 条件对象
	 */
	public Request put(Object object) {
		this.codex.putAll(BeanUtils.obj2Map(object));
		return this;
	}

	/**
	 * 增加额外查询条件
	 * 
	 * @param propertyName 属性名
	 * @param value        属性值
	 */
	public Request put(String propertyName, Object value) {
		this.codex.put(propertyName, value);
		return this;
	}

	/**
	 * 获取指定条件名称的值
	 * 
	 * @param propertyName 属性名
	 * @return
	 */
	public Object get(String propertyName) {
		Object obj = this.codex.get(propertyName);
		if (obj != null && obj.getClass().isArray() && ((Object[]) obj).length == 1) {
			obj = ((Object[]) obj)[0];
		}
		return obj;
	}

	/**
	 * 获取指定条件名称的值
	 * 
	 * @param propertyName 属性名
	 * @return
	 */
	public String getString(String propertyName) {
		Object obj = this.codex.get(propertyName);
		if (obj != null && obj.getClass().isArray() && ((Object[]) obj).length == 1) {
			obj = ((Object[]) obj)[0];
		}
		return obj == null ? "" : obj.toString();
	}

	/**
	 * 字段升序
	 * 
	 * @param columnName 数据库字段名
	 * @return 对象本身（链式操作）
	 */
	public Request asc(String columnName) {
		if (orders_ == null) {
			orders_ = new LinkedHashMap<>();
		}
		this.orders_.put(columnName, "ASC");
		return this;
	}

	/**
	 * 字段降序
	 * 
	 * @param columnName 数据库字段名
	 * @return 对象本身（链式操作）
	 */
	public Request desc(String columnName) {
		if (orders_ == null) {
			orders_ = new LinkedHashMap<>();
		}
		this.orders_.put(columnName, "DESC");
		return this;
	}

	/**
	 * 查询类型的枚举 (COUNT:页码查询/LIMIT:限制查询/LIST:列表查询/PAGE:分页查询)
	 * 
	 * @author Liang.Wang
	 * 
	 */
	public enum QueryType {
		/** 页码查询（只查询页码信息） */
		COUNT,
		/** 限制查询（只查询数据列表不统计） */
		LIMIT,
		/** 列表查询（只查询数据列表信息） */
		LIST,
		/** 分页查询（含页码查询和列表查询）：默认方式 */
		PAGE;
	}
}
